import logger from '../utils/logger.js'
/**
 * 编辑器资源清理工具
 * 用于在页面跳转时强制清理所有编辑器相关资源
 */

/**
 * 强制清理所有编辑器资源
 */
export function forceCleanupEditorResources() {
  logger.log('🧹 [EditorCleanup] 开始强制清理编辑器资源...')
  
  try {
    // 1. 清理全局变量
    logger.log('🧹 [EditorCleanup] 清理全局变量...')
    delete window.__gocUpdatePen
    delete window.__gocSetPenVisible
    delete window.__gocEditorInstance
    logger.log('✅ [EditorCleanup] 全局变量清理完成')
    
    // 2. 清理所有定时器
    logger.log('🧹 [EditorCleanup] 清理定时器...')
    const highestTimeoutId = setTimeout(() => {}, 0)
    for (let i = 0; i < highestTimeoutId; i++) {
      clearTimeout(i)
    }
    logger.log('✅ [EditorCleanup] 定时器清理完成')
    
    // 3. 清理所有动画帧
    logger.log('🧹 [EditorCleanup] 清理动画帧...')
    const highestAnimationFrameId = requestAnimationFrame(() => {})
    for (let i = 0; i < highestAnimationFrameId; i++) {
      cancelAnimationFrame(i)
    }
    logger.log('✅ [EditorCleanup] 动画帧清理完成')
    
    // 4. 清理Monaco编辑器实例
    logger.log('🧹 [EditorCleanup] 清理Monaco编辑器...')
    if (window.monaco && window.monaco.editor) {
      try {
        // 获取所有编辑器实例并销毁
        const editors = window.monaco.editor.getModels()
        editors.forEach(model => {
          try {
            model.dispose()
          } catch (e) {
            // 忽略错误
          }
        })
        logger.log('✅ [EditorCleanup] Monaco编辑器清理完成')
      } catch (error) {
        logger.warn('⚠️ [EditorCleanup] Monaco编辑器清理时出错:', error)
      }
    }
    
    // 5. 清理Canvas元素
    logger.log('🧹 [EditorCleanup] 清理Canvas元素...')
    const canvases = document.querySelectorAll('canvas')
    canvases.forEach(canvas => {
      try {
        const ctx = canvas.getContext('2d')
        if (ctx) {
          ctx.clearRect(0, 0, canvas.width, canvas.height)
        }
      } catch (e) {
        // 忽略错误
      }
    })
    logger.log('✅ [EditorCleanup] Canvas元素清理完成')
    
    // 6. 强制垃圾回收
    logger.log('🧹 [EditorCleanup] 强制垃圾回收...')
    if (window.gc && typeof window.gc === 'function') {
      try {
        window.gc()
        logger.log('✅ [EditorCleanup] 垃圾回收完成')
      } catch (error) {
        logger.warn('⚠️ [EditorCleanup] 垃圾回收时出错:', error)
      }
    }
    
    logger.log('✅ [EditorCleanup] 编辑器资源强制清理完成')
    return true
    
  } catch (error) {
    logger.error('❌ [EditorCleanup] 清理过程中发生错误:', error)
    return false
  }
}

/**
 * 检查是否有编辑器资源泄漏
 */
export function checkEditorResourceLeaks() {
  const leaks = []
  
  // 检查全局变量
  if (window.__gocUpdatePen) {
    leaks.push('__gocUpdatePen 全局变量未清理')
  }
  if (window.__gocSetPenVisible) {
    leaks.push('__gocSetPenVisible 全局变量未清理')
  }
  
  // 检查Monaco编辑器实例
  if (window.monaco && window.monaco.editor) {
    const models = window.monaco.editor.getModels()
    if (models.length > 0) {
      leaks.push(`${models.length} 个Monaco编辑器模型未清理`)
    }
  }
  
  return leaks
}

/**
 * 在页面跳转前调用此函数
 */
export function beforePageNavigation() {
  logger.log('🚀 [EditorCleanup] 页面即将跳转，执行清理...')
  const success = forceCleanupEditorResources()
  
  if (success) {
    logger.log('✅ [EditorCleanup] 页面跳转清理完成')
  } else {
    logger.warn('⚠️ [EditorCleanup] 页面跳转清理失败')
  }
  
  return success
}

// 导出默认清理函数
export default forceCleanupEditorResources
